// 定义一个接口为'Person'
interface Person {
  name: string,
  age: number
}
// 定义一个变量'catliu',它的类型是'Person'
let catliu: Person = {
  name: 'zpp',
  age: 23
}
// 这样，我们就约束了catliu 的形状必须和接口Person 一致。
// 注意：赋值的时候，变量的形状必须和接口的形状保持一致。

//==========================可选属性==========================
// 有时候我们不要匹配一个完整的形状
interface Person2{
  name: string,
  age?: number
}
let catliu2: Person2 = {
  name: 'tgd'
}
// 注意：仍然不允许添加未定义的属性：
// =========================任意属性===================================
interface Person3 {
  name: string,
  age?: number,
  [propName: string]: any //任意属性
}
let catliu3: Person3 = {
  name: 'zpp',
  website: 'http:www.baidu.com'
}
// 注意：一旦定义了任意属性，那么确定属性和可选属性都必须是它的子属性：

// ============================只读属性===================================
interface Person4 {
  name: string,
  readonly id: number,
  age?: number,
  [propName:string]: any
}
let catliu4: Person4 = {
  name:'tgd',
  id: 123,
  age: 23,
  website: 'http://www.baidu.com'
}
// catliu4.id = 234;   //02Objecttypes-interface.ts(49,9): error TS2540: Cannot assign to 'id' because it is a constant or a read-only property.
// 只读的约束存在于第一次给"对象"赋值的时候，而不是第一次给只读属性赋值的时候：
